# A、B、C、D、E、F、G、H、I、J共10名学生
# 0、1、2、3、4、5、6、7、8、9
# 条件
# 1、如果A参加，B也参加。
# 2、如果C不参加，D也不参加。
# 3、A和C只能有一个人参加。
# 4、B和D有且仅有一个人参加。
# 5、D、E、F、G、H 中至少有2人参加。
# 6、C和G或者都参加，或者都不参加。
# 7、C、E、G、I中最多有2人参加。
# 8、如果E参加，那么F和G也都参加。
# 9、如果F参加，那么G、H就不能参加。
# 10、如果I、J都不参加，H必需参加。·~·

# 学生列表
students = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']

# 约束条件检查函数
def check_constraints(participants):
    # 约束1：如果A参加，B也参加。
    if participants[0] and not participants[1]:
        return False

    # 约束2：如果C不参加，D也不参加。
    if not participants[2] and participants[3]:
        return False

    # 约束3：A和C只能有一个人参加。
    if participants[0] and participants[2]:
        return False

    # 约束4：B和D有且仅有一个人参加。
    if participants[1] == participants[3]:
        return False

    # 约束5：D、E、F、G、H中至少有2人参加。
    if sum(participants[3:8]) < 2:
        return False

    # 约束6：C和G要么都参加，要么都不参加。
    if participants[2] != participants[6]:
        return False

    # 约束7：C、E、G、I中最多有2人参加。
    if sum([participants[2], participants[4], participants[6], participants[8]]) > 2:
        return False

    # 约束8：如果E参加，那么F和G也都参加。
    if participants[4] and (not participants[5] or not participants[6]):
        return False

    # 约束9：如果F参加，那么G和H就不能参加。
    if participants[5] and (participants[6] or participants[7]):
        return False

    # 约束10：如果I和J都不参加，H必须参加。
    if not participants[8] and not participants[9] and not participants[7]:
        return False

    return True


# 生成所有可能的布尔组合并检查约束条件
def generate_combinations():
    # 通过遍历所有的布尔值组合来生成可能的参加情况
    # 每个学生有True（参加）或False（不参加）两种选择
    res=[]
    for bitmask in range(2 ** 10):  # 2^10种组合
        participants = [(bitmask >> i) & 1 for i in range(10)]  # 获取当前组合的布尔值

        # 检查该组合是否符合约束条件
        if check_constraints(participants):
            # 输出符合条件的组合
            result = [students[i] for i, p in enumerate(participants) if p]
            res.append(" ".join(result))
    return res

# 主函数，启动解法
res = generate_combinations()
res.sort()
[print(item) for item in res]


